home *** CD-ROM | disk | FTP | other *** search
- /* AuditEntryFormat.c */
- /*
- * AuditEntryFormat.c
- * Copyright © 1992-93 Apple Computer Inc. All Rights Reserved.
- * Programmed by Martin Minow,
- * Internet: minow@apple.com
- * AppleLink: MINOW
- * Version of January 14, 1993
- *
- * Edit History
- * 93.01.09 MM First public release
- * 93.07.09 MM Reformatted for 80-column page. No substantive changes.
- * 93.08.25 MM Added "Roman Script" bit vector for character visibility.
- * Format an AuditEntryRecord. Note: there is no size checking, which means that
- * if you somehow manage to create an extra-long record, you'll get garbage. The
- * functions won't corrupt memory, however.
- */
- #include "Audit.h"
- #include <Memory.h>
- #include <OSUtils.h>
-
- /*
- * result may not have side-effects.
- */
- #define AppendChar(result, c) (result[++result[0]] = (c))
- static void AppendUnsigned(StringPtr, unsigned long);
- static void AppendSigned(StringPtr, signed long);
- static void AppendUnsignedLeadingZeros(StringPtr, unsigned long, short, short);
- static void AppendHexLeadingZeros(StringPtr, unsigned long, short);
- static void AppendPascalString(StringPtr, const StringPtr);
- static void AppendOSType(StringPtr, OSType);
-
- enum {
- NUL = 0,
- kOpenQuote = 0xD2,
- kCloseQuote = 0xD3
- };
-
- #define AUDIT (*auditPtr)
- #define ENTRY (*entryPtr)
-
- /*
- * FormatAuditEntryData() converts an audit record entry into readable text,
- * storing the result in the Pascal string argument.
- */
- void
- FormatAuditEntryData(
- register AuditEntryPtr entryPtr,
- StringPtr result
- )
- {
- unsigned long datum;
- unsigned long format;
- unsigned short thisFormat;
- register unsigned long *dataPtr;
- unsigned long *dataEnd;
-
- result[0] = 0;
- if (ENTRY.lostData != 0) {
- AppendUnsigned(result, ENTRY.lostData);
- AppendPascalString(result, "\p lost, ");
- }
- AppendOSType(result, ENTRY.idCode);
- AppendPascalString(result, "\p: ");
- format = ENTRY.format;
- dataPtr = ENTRY.data;
- dataEnd = &ENTRY.data[8];
- while (dataPtr < dataEnd) {
- thisFormat = (format & kAuditFormatMask);
- format >>= kAuditFormatShift;
- if (thisFormat == kAuditFormatEnd)
- break;
- else if (thisFormat == kAuditFormatString) {
- if (dataPtr > &ENTRY.data[0])
- AppendChar(result, ' ');
- AppendChar(result, kOpenQuote); /* Open double quote */
- AppendPascalString(result, (StringPtr) dataPtr);
- AppendChar(result, kCloseQuote);
- break; /* Exit loop */
- }
- else if (thisFormat == kAuditFormatLocation) {
- if (dataPtr > &ENTRY.data[0])
- AppendChar(result, ' ');
- datum = *dataPtr++; /* Offset */
- if (datum == 0 && dataPtr < dataEnd)
- AppendHexLeadingZeros(result, *dataPtr, 8);
- else {
- if (dataPtr < dataEnd)
- AppendPascalString(result, (StringPtr) dataPtr);
- AppendPascalString(result, "\p + 0x");
- AppendHexLeadingZeros(result, datum, 4);
- }
- break; /* Exit loop */
- }
- else {
- if (dataPtr > &ENTRY.data[0])
- AppendPascalString(result, "\p, ");
- datum = *dataPtr++;
- switch (thisFormat) {
- case kAuditFormatSigned:
- AppendSigned(result, (signed long) datum);
- break;
- case kAuditFormatUnsigned:
- AppendUnsigned(result, datum);
- break;
- case kAuditFormatHex:
- AppendHexLeadingZeros(result, datum, 8);
- AppendPascalString(result, "\p=");
- AppendOSType(result, datum);
- break;
- case kAuditFormatAddress:
- default: /* Unknown */
- AppendHexLeadingZeros(result, datum, 8);
- break;
- }
- }
- }
- #undef DATA
- }
-
- /*
- * FormatAuditEntryTimestamp() converts an audit record entry's timestamp into
- * readable text, storing the result in the Pascal string argument.
- */
- void
- FormatAuditEntryTimestamp(
- register AuditPtr auditPtr,
- register AuditEntryPtr entryPtr,
- StringPtr result
- )
- {
- unsigned long elapsedTicks;
- unsigned long timeNow;
- DateTimeRec dateTimeRec;
-
- result[0] = 0;
- elapsedTicks = ENTRY.tickCount - AUDIT.ticksAtStart;
- timeNow = AUDIT.timeAtStart + (elapsedTicks / 60L);
- Secs2Date(timeNow, &dateTimeRec);
- AppendUnsignedLeadingZeros(result, dateTimeRec.year, 4, '.');
- AppendUnsignedLeadingZeros(result, dateTimeRec.month, 2, '.');
- AppendUnsignedLeadingZeros(result, dateTimeRec.day, 2, ' ');
- AppendUnsignedLeadingZeros(result, dateTimeRec.hour, 2, ':');
- AppendUnsignedLeadingZeros(result, dateTimeRec.minute, 2, ':');
- AppendUnsignedLeadingZeros(result, dateTimeRec.second, 2, '.');
- elapsedTicks = ((elapsedTicks % 60L) * 1000L) / 60L; /* Msec */
- AppendUnsignedLeadingZeros(result, elapsedTicks, 3, NUL);
- }
-
- /*
- * Output an n-digit decimal value with leading zeros.
- */
- static void
- AppendUnsignedLeadingZeros(
- StringPtr result,
- unsigned long value,
- short digits,
- short terminator
-
- )
- {
- if (--digits > 0)
- AppendUnsignedLeadingZeros(result, value / 10, digits, NUL);
- AppendChar(result, (value % 10) + '0');
- if (terminator != NUL)
- AppendChar(result, terminator);
- }
-
- /*
- * Output a signed decimal longword.
- */
- static void
- AppendSigned(
- StringPtr result,
- signed long value
- )
- {
- if (value < 0) {
- AppendChar(result, '-');
- value = (-value);
- }
- AppendUnsigned(result, (unsigned long) value);
- }
-
- /*
- * Output an unsigned decimal longword.
- */
- static void
- AppendUnsigned(
- StringPtr result,
- unsigned long value
- )
- {
- if (value >= 10)
- AppendUnsigned(result, value / 10);
- AppendChar(result, (value % 10) + '0');
- }
-
- /*
- * Output a string of hex digits with leading zeros.
- */
- static void
- AppendHexLeadingZeros(
- StringPtr result,
- unsigned long value,
- short digits
- )
- {
- if (--digits > 0)
- AppendHexLeadingZeros(result, value >> 4, digits);
- value &= 0x0F;
- AppendChar(result,
- (value < 10)
- ? value + '0'
- : (value + ('A' - 10))
- );
- }
-
- /*
- * Output a 4-byte character string. Unknown bytes are replaced by '•'.
- * Note: this presumes that we are using the "Roman" script.
- */
- static void
- AppendOSType(
- StringPtr result,
- OSType datum
- )
- {
- unsigned char value[sizeof (OSType)];
- register short i;
- register unsigned short c;
- static const unsigned long bitVector[256 / 32] = {
- 0x00000000, /* 00-1F 0 - 31 */
- 0xFFFFFFFF, /* 20-3F 32 - 63 ' ' '?' */
- 0xFFFFFFFF, /* 34-5F 64 - 95 '@' '_' */
- 0x7FFFFFFF, /* 60-7F 96 - 127 '`' Del */
- 0xFFFFFFFF, /* 80-9F 128 - 159 */
- 0xFFFFFFFF, /* A0-BF 160 - 191 */
- 0x1FFFFFFF, /* C0-BF 192 - 223 */
- 0x00010000 /* E0-FF 224 - 255 */
- };
- BlockMove(&datum, value, sizeof (OSType));
- AppendChar(result, '\'');
- for (i = 0; i < sizeof (OSType); i++) {
- c = value[i];
- if ((bitVector[c >> 5] & (1LU << (c & 31))) == 0)
- c = 0xA5; /* Big dot */
- AppendChar(result, c);
- }
- AppendChar(result, '\'');
- }
-
- static void
- AppendPascalString(
- StringPtr result,
- const StringPtr datum
- )
- {
- register short i;
-
- for (i = 1; i <= datum[0]; i++)
- AppendChar(result, datum[i]);
- }
-